home *** CD-ROM | disk | FTP | other *** search
/ PC Elektro 3 / PC-Elektro-3-cd1.bin / KBan 2.0 / KBANSRC.LZH / SRC / PROG / KBANDATA / KBANDATA.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-10-07  |  5.5 KB  |  241 lines

  1. // the implementation of class KBAN_DATA
  2. // Copyright (C) 1996 Kazutaka Hirata <khirata@jove.acs.unt.edu>
  3.  
  4. #include "file.h"
  5.  
  6. #include "kbandata.h"
  7.  
  8. /*
  9.         KBAN_DATA COMPONENT_LIST COMPONENT_ELEMENT LAYER PIN_LIST LINE_LIST
  10. ---------------------------------------------------------------------------
  11.  200A8  200A8     n/a            200A8             200A8 200A8    200A8
  12.  200B0  200A8     n/a            200A8             200A8 200B0    200A8
  13.  200B18 200B18    200B18         200B18            200A8 200B0    200A8
  14. */
  15.  
  16. void KBAN_DATA::operator=(const KBAN_DATA& src)
  17. {
  18.   m_primitive      = src.m_primitive     ;
  19.   m_component_list = src.m_component_list;
  20. }
  21.  
  22. uint KBAN_DATA::load_get_version(FILE_NEW &fp) const
  23. {
  24.   FILE_VERSION fver;
  25.   char str[1024];
  26.   fp.gets_wo_return(str, 1024);
  27.   return fver.get_version_no(str);
  28. }
  29.  
  30. enum KBAN_DATA_KIND {
  31.   KBAN_DATA_KIND_PRIMITIVE,
  32.   KBAN_DATA_KIND_COMPONENT,
  33.   KBAN_DATA_KIND_UNKNOWN
  34. };
  35.  
  36. void KBAN_DATA::clear(void)
  37. {
  38.   primitive     ().clear();
  39.   component_list().clear();
  40. }
  41.  
  42. XY KBAN_DATA::get_max(void) const
  43. {
  44.   return ::get_max(primitive().get_max(), component_list().get_max());
  45. }
  46.  
  47. XY KBAN_DATA::get_min(void) const
  48. {
  49.   return ::get_min(primitive().get_min(), component_list().get_min());
  50. }
  51.  
  52. void KBAN_DATA::shift(const XY& ac_dif, KBAN_DATA& target) const
  53. {
  54.   primitive     ().shift(ac_dif, target.primitive     ());
  55.   component_list().shift(ac_dif, target.component_list());
  56. }
  57.  
  58. void KBAN_DATA::unselect(void)
  59. {
  60.   primitive     ().unselect();
  61.   component_list().unselect();
  62. }
  63.  
  64. void KBAN_DATA::select_items_in_block(const XY& ac1, const XY& ac2)
  65. {
  66.   primitive     ().select_items_in_block(ac1, ac2);
  67.   component_list().select_items_in_block(ac1, ac2);
  68. }
  69.  
  70. void KBAN_DATA::collect_selected_items(KBAN_DATA& dst) const
  71. {
  72.   primitive     ().collect_selected_items(dst.primitive()     );
  73.   component_list().collect_selected_items(dst.component_list());
  74. }
  75.  
  76. void KBAN_DATA::remove_selected_items(void)
  77. {
  78.   primitive     ().remove_selected_items();
  79.   component_list().remove_selected_items();
  80. }
  81.  
  82. int KBAN_DATA::load_170(FILE_NEW& fp)
  83. {
  84.   for(;;) {
  85.     char str[1024];
  86.     if(fp.gets_wo_return(str, 1024) == NULL) {
  87.       break;
  88.     } else {
  89.       if(!strcmp(str, "primitive")) {
  90.         primitive().load_primitive_170(fp);
  91.       } else if(!strcmp(str, "component")) {
  92.         component_list().load_170(fp);
  93.         break;
  94.       } else {
  95.         // coprrupted
  96.         break;
  97.       }
  98.     }
  99.   }
  100.   return true;
  101. }
  102.  
  103. static const INTSTR_ELEMENT kban_data_kind_str_table[] = {
  104. {KBAN_DATA_KIND_PRIMITIVE, "primitive"},
  105. {KBAN_DATA_KIND_COMPONENT, "component"},
  106. {KBAN_DATA_KIND_UNKNOWN  , NULL       }
  107. };
  108.  
  109. int KBAN_DATA::load_200a8(FILE_NEW &fp)
  110. {
  111.     for(;;) {
  112.         char str[1024];
  113.         fp.gets_wo_return(str, 1024);
  114.         if(!strcmp(str, "end")) {
  115.             break;
  116.         } else {
  117.             INTSTR_TABLE table(kban_data_kind_str_table, KBAN_DATA_KIND_UNKNOWN);
  118.             KBAN_DATA_KIND kind = (KBAN_DATA_KIND)table.get_no(str);
  119.             switch(kind) {
  120.                 case KBAN_DATA_KIND_PRIMITIVE : {
  121.                     primitive().load(fp);
  122.                     break;
  123.                 }
  124.                 default : {
  125.                     break;
  126.                 }
  127.             }
  128.         }
  129.     }
  130.     return true;
  131. }
  132.  
  133. int KBAN_DATA::load_200b18(FILE_NEW& fp)
  134. {
  135.     for(;;) {
  136.         char str[1024];
  137.         fp.gets_wo_return(str, 1024);
  138.         if(!strcmp(str, "end")) {
  139.             break;
  140.         } else {
  141.             INTSTR_TABLE table(kban_data_kind_str_table, KBAN_DATA_KIND_UNKNOWN);
  142.             KBAN_DATA_KIND kind = (KBAN_DATA_KIND)table.get_no(str);
  143.             switch(kind) {
  144.                 case KBAN_DATA_KIND_PRIMITIVE : {
  145.                     primitive().load(fp);
  146.                     break;
  147.                 }
  148.                 case KBAN_DATA_KIND_COMPONENT : {
  149.                     component_list().load(fp);
  150.                     break;
  151.                 }
  152.                 default : {
  153.                     break;
  154.                 }
  155.             }
  156.         }
  157.     }
  158.     return true;
  159. }
  160.  
  161. int KBAN_DATA::load(FILE_NEW &fp)
  162. {
  163.     typedef int (KBAN_DATA::*LOAD_FUNC)(FILE_NEW &fp);
  164.     LOAD_FUNC load_func;
  165.     int retval;
  166.  
  167.     uint version = load_get_version(fp);
  168.     switch(version) {
  169.         case FILE_VERSION::VERSION_170 : {
  170.             load_func = &KBAN_DATA::load_170;
  171.             break;
  172.         }
  173.         case FILE_VERSION::VERSION_200A8 : {
  174.             load_func = &KBAN_DATA::load_200a8;
  175.             break;
  176.         }
  177.         case FILE_VERSION::VERSION_200B0 : {
  178.             load_func = &KBAN_DATA::load_200a8; // the same as 200a8
  179.             break;
  180.         }
  181.         case FILE_VERSION::VERSION_200B18 : {
  182.             load_func = &KBAN_DATA::load_200b18;
  183.             break;
  184.         }
  185.         default : {
  186.             load_func = NULL;
  187.         }
  188.     }
  189.     if(load_func != NULL) {
  190.         (this->*load_func)(fp);
  191.         retval = true;
  192.     } else {
  193.         retval = false;
  194.     }
  195.     return retval;
  196. }
  197.  
  198. int KBAN_DATA::save(FILE_NEW &fp) const
  199. {
  200.   FILE_VERSION fver;
  201.   fp.printf("%s\n", fver.get_version_str(FILE_VERSION::VERSION_200B18));
  202.  
  203.   fp.puts("primitive\n");
  204.   primitive().save(fp);
  205.  
  206.   fp.puts("component\n");
  207.   component_list().save(fp);
  208.  
  209.   fp.puts("end\n");
  210.   return true;
  211. }
  212.  
  213. void KBAN_DATA::collect_aperture(APT_TABLE &apt_pin_table, APT_TABLE &apt_line_table) const
  214. {
  215.   primitive     ().collect_aperture(apt_pin_table, apt_line_table);
  216.   component_list().collect_aperture(apt_pin_table, apt_line_table);
  217. }
  218.  
  219. void KBAN_DATA::operator+=(const KBAN_DATA &target)
  220. {
  221.   primitive     () += target.primitive     ();
  222.   component_list() += target.component_list();
  223. }
  224.  
  225. bool KBAN_DATA::empty() const
  226. {
  227.   return primitive().empty() && component_list().empty();
  228. }
  229.  
  230. void KBAN_DATA::rotate_90()
  231. {
  232.   primitive     ().rotate_90();
  233.   component_list().rotate_90();
  234. }
  235.  
  236. void KBAN_DATA::limit_drill_size(uint drill)
  237. {
  238.   primitive     ().limit_drill_size(drill);
  239.   component_list().limit_drill_size(drill);
  240. }
  241.